薛博阳, NVIDIA 加速计算专家团队 高级工程师
2025/11/07
在提出 NVFP4 之前,我们通常将模型量化到 FP8 以加速推理。这其中涉及多种 FP8 的布局和粒度:
* 布局格式: E4M3 (通常用于推理) vs. E5M2 (通常用于训练)。
* 粒度: 按张量 (Per tensor) vs. 按通道 (per channel) vs. 按词元 (per token) vs. 按块 (per block)。
* 量化方式: 静态量化 (Static quantization) vs. 动态量化 (dynamic quantization)。
为了进一步减少内存使用并加速推理,业界进行了大量工作来研究如何从 8-bit 降至 4-bit 同时保持准确率。
下表比较了不同数据类型在 HGX-B200 和 H200-SXM* 上的性能差异,显示了 FP4 相对于 FP8 的显著性能提升潜力。
*注:技术讨论和参考,性能可能因产品组合而异。
下表详细对比了 INT8, FP8, MXFP8, INT4, 以及 NVFP4 这几种量化方案在表示方式、权重/激活量化粒度、量化方式和缩放因子数据类型等方面的差异。
NVFP4 的结构类似于大多数 4-bit 浮点格式 (E2M1),包含:
该格式的数值范围大约在 -6 到 6 之间。例如,范围内的值可以包括 0.0, 0.5, 1.0, 1.5, 2, 3, 4, 6 (以及对应的负值)。
两级缩放 (Two level scaling):
NVFP4 存储一个 4-bit 值,外加每个张量一个 FP32 的二级缩放因子和每16个值一个 FP8 的一级缩放因子的开销。与 FP8 相比,这大约能将模型内存占用减少 1.8 倍。
作为对比,传统的块级 FP8 量化流程如下:对一个 FP16 权重张量 W,每 128 x 128 个元素计算一次局部最大值 local_max,然后用这个最大值计算出缩放因子,最后将权重 W 量化为 FP8。
与单级缩放的 FP8 不同,NVFP4 采用两级缩放策略以保持精度:
W 分成每 16 个元素一组。local_max,然后除以一个常数 (6) 得到一级缩放因子 S (FP32)。使用这个缩放因子将权重块量化为 W_FP4。S 的全局最大值 global_max。S 量化为 S_FP8。下图展示了 NVFP4 量化流程与校准代码片段的对应关系,其中 SF1 和 SF2 分别对应二级和一级缩放因子的计算。
具体的缩放因子计算逻辑可以在 TensorRT-Model-Optimizer 的代码中找到。下图高亮了计算一级 (SF2) 和二级 (SF1) 缩放因子的核心代码。
在推理过程中,输入激活 X 和权重 W 都被量化。
Whp 被量化 (Quantization, Q) 为 Wfp4。Xhp 被动态量化 (Dynamic Quantization, DynQ) 为 Xfp4,同时生成缩放因子 SFfp8。Wfp4 和 Xfp4 分别被反量化 (Dequantization, DQ) 回高精度。SFfp8 也被反量化为 SFhp,并应用于反量化后的激活。Xfp4, Wfp4 和缩放因子 SFfp8,在内部完成计算,从而极大地提升了计算效率和内存带宽利用率。此部分比较了三种不同的4位浮点格式:FP4 (E2M1)、MXFP4 和 NVFP4。
格式对比:
FP4 (E2M1):
MXFP4:
NVFP4:
下表展示了针对不同模型和模块的 NVFP4 配置方案。
NVFP4-full (用于 DeepSpeed):
NVFP4-MoE:
NVFP4-MoE+Proj (用于 DeepSpeed):
下图展示了 DeepSeek-R1-0528 在不同配置下的评估精度得分。结果表明,FP4 (NVFP4-MoE 和 NVFP4-MoE+Proj) 与 FP8 (AA Ref) 的精度相当。
数据来源:
下图展示了 Qwen3-235B 的评估精度得分,比较了 FP8 (A22B AA Ref) 和 NVFP4 (NVFP4-full) 的表现。结果显示两者精度非常接近。
* 注:由 nv-eval 评估。
下图展示了在 DeepSeek 模型中应用 NVFP4-MoE 配置方案的详细计算流程。
下图展示了在 Qwen3 的 Attention 模块中应用 Full NVFP4 配置方案的数据流。输入张量 (Transformer Input) 首先被量化为 NVFP4,用于 QKV GEMM。KV Cache 使用 FP8 格式。最后的 Proj GEMM 也使用 NVFP4 权重和输入。
下图展示了在 Qwen3 的 MoE (Mixture of Experts) 模块中应用 Full NVFP4 配置方案的数据流。输入被量化为 NVFP4 并传递给专家网络中的 FC1 和 FC2 GEMM。
对于 DeepSeek,由于模型规模较大,目前量化模型需要约 1200 GBs 的显存。
此文档 https://github.com/NVIDIA/TensorRT-Model-Optimizer/tree/main/examples/deepseek 展示了将 DeepSeek 模型从 FP8 量化到 NVFP4 的步骤。
* 仅供技术讨论和参考,性能可能因产品组合不同而异。
具体命令:
克隆仓库并设置环境变量:
# 克隆 TensorRT-Model-Optimizer 仓库
git clone https://github.com/NVIDIA/TensorRT-Model-Optimizer.git
cd TensorRT-Model-Optimizer/examples/deepseek/
# 设置运行示例所需的变量
export HF_FP8_CKPT={path_to_downloaded_hf_checkpoint}
export DS_CKPT={path_to_save_converted_checkpoint}
export FP4_QUANT_PATH={path_to_save_quantization_results}
export HF_FP4_PATH={path_to_save_the_final_FP4_checkpoint}
# 从 Huggingface 下载 FP8 检查点
huggingface-cli download deepseek-ai/DeepSeek-R1 --local-dir $HF_FP8_CKPT
# 克隆 DeepSeek-V3 (R1 的基础模型) 仓库用于 FP8 推理
git clone https://github.com/deepseek-ai/DeepSeek-V3.git && cd DeepSeek-V3 && git checkout 1398880
# 将 HF 检查点转换为 DeepSeek 的特定格式
python inference/convert.py --hf-ckpt-path $HF_FP8_CKPT --save-path $DS_CKPT --n-experts 256 --model-parallel 8
cd ..
运行校准脚本并量化检查点:
# 为基础版运行校准脚本 torchrun --nproc-per-node 8 --master_port=12346 ptq.py --model_path $DS_CKPT --config DeepSeek-V3/inference/configs/config_671B.json --quant_cfg NVFP4_DEFAULT_CFG --output_path $FP4_QUANT_PATH # 为 V2 版运行校准脚本 torchrun --nproc-per-node 8 --master_port=12346 ptq.py --model_path $DS_CKPT --config DeepSeek-V3/inference/configs/config_671B.json --quant_cfg NVFP4_DEFAULT_CFG --output_path $FP4_QUANT_PATH --enable_wo_quant # 将 FP8 hf 检查点量化为 FP4 ./quantize_fp8_to_nvfp4.sh --amax_path $FP4_QUANT_PATH --fp4_output_path $HF_FP4_PATH --fp8_hf_path $HF_FP8_CKPT --world_size 8
以下是针对 Qwen3-235B 模型的量化步骤和命令:
git clone https://github.com/NVIDIA/TensorRT-Model-Optimizer.git -b 0.33.1
pushd TensorRT-Model-Optimizer
pip install -e .
pip install -r examples/llm_ptq/requirements.txt
pip install accelerate datasets
python examples/llm_ptq/hf_ptq.py --pyt_ckpt_path=./Qwen3/Qwen3-235B-A22B --export_path=./Qwen3/Qwen3-235B-A22B_nvfp4_hf --sparsity_fmt=dense --qformat=nvfp4 --calib_size=512 --batch_size=0 --inference_tensor_parallel=1 --inference_pipeline_parallel=1 --export_fmt=hf
可以使用以下命令进行离线评估:
# MMLU evaluation
trtllm-eval --model=Qwen3/saved_models_Qwen3-235B-A22B_nvfp4_hf --tokenizer=Qwen3/saved_models_Qwen3-235B-A22B_nvfp4_hf --backend=pytorch --tp_size 4 --kv_cache_free_gpu_memory_fraction 0.4 mmlu --dataset_path=mmlu/
# GSM8K evaluation
trtllm-eval --model=Qwen3/saved_models_Qwen3-235B-A22B_nvfp4_hf --tokenizer=Qwen3/saved_models_Qwen3-235B-A22B_nvfp4_hf --backend=pytorch --tp_size 4 --kv_cache_free_gpu_memory_fraction 0.4 gsm8k --dataset_path=gsm8k/
# GPQA evaluation
trtllm-eval --model=Qwen3/saved_models_Qwen3-235B-A22B_nvfp4_hf --tokenizer=Qwen3/saved_models_Qwen3-235B-A22B_nvfp4_hf --backend=pytorch --tp_size 4 --kv_cache_free_gpu_memory_fraction 0.4 gpqa_diamond --dataset_path=gpqa/
可以使用以下命令进行在线评估:
mpirun -n 1 --allow-run-as-root --oversubscribe trtllm-serve ./Qwen3/saved_models_Qwen3-235B-A22B_nvfp4_hf --backend pytorch --max_batch_size 32 --max_num_tokens 8192 --tp_size 8 --host 0.0.0.0 --port 30000 --kv_cache_free_gpu_memory_fraction 0.8
pip install lm-eval[api]
lm_eval --model local-completions --tasks gsm8k --model_args model=./Qwen3/saved_models_Qwen3-235B-A22B_nvfp4_hf,base_url=http://0.0.0.0:30000/v1/completions,max_retries=3,tokenized_requests=False,timeout=1200,max_gen_toks=2048,max_length=8192 --batch_size 32 --trust_remote_code
注意:MMLU, GPQA 目前不受支持。
下表总结了 InferenceMAX v1 基准测试中涵盖的模型类型、精度、输入和输出序列长度。
表格内容摘要:
- DeepSeek-R1: MoE 模型,671B 总参数(37B 激活参数),采用 FP8 和 NVFP4 精度,测试场景包括 1K/1K、8K/1K、1K/8K 的输入/输出序列长度(ISL/OSL)。
- gpt-oss-120b: MoE 模型,117B 总参数(5.1B 激活参数),采用 FP8 和 MXFP4 精度,测试场景包括 1K/1K、1K/8K 的输入/输出序列长度。
- Llama 3.3 70B: Dense 模型,70B 参数,采用 FP8 和 NVFP4 精度,测试场景包括 1K/1K、8K/1K、1K/8K 的输入/输出序列长度。
下图展示了 DeepSeek-R1 模型在 Blackwell GPU 上的性能表现,比较了 DPAE7B-NVFP4、DPE67B-NVFP4 和 DPE67B-FP8 三种配置在 1k 输入 8k 输出(1k-8k)场景下的性能。图中横轴表示每用户的吞吐率(TPS/User),纵轴表示每 GPU 的吞吐率(TPS/GPU)。
结果表明,在相同的用户交互性(TPS/User)水平下,采用 NVFP4 格式的配置(DPAE7B-NVFP4 和 DPE67B-NVFP4)相比 FP8 格式(DPE67B-FP8)能够实现更高的 GPU 吞吐量。
注:仅供技术讨论和参考,实际性能可能因产品组合而异。
下图展示了 Qwen3-480B 模型在 Blackwell GPU 上的性能,配置为 2k 输入 1k 输出(2k-1k)。图中比较了 DPAE4N-NVFP4 和 DPAE4N-FP8 两种精度配置。
结果显示,在不同的用户交互性(TPS/User)水平下,使用 NVFP4 精度的 DPAE4N-NVFP4 始终比使用 FP8 精度的 DPAE4N-FP8 具有更高的 GPU 吞吐量(TPS/GPU)。
注:仅供技术讨论和参考,实际性能可能因产品组合而异。
在 Llama 3.3 70B 模型(1k 输入/1k 输出)的基准测试中,NVIDIA Blackwell 架构展现出显著的性能优势。
注:仅供技术讨论和参考,实际性能可能因产品组合而异。
参考链接:https://developer.nvidia.com/blog/nvidia-blackwell-leads-on-new-semianalysis-inferencemax-benchmarks
本页分析了 Blackwell 架构在性能提升之外带来的巨大商业价值。
InferenceMAX v1 性能测试 (DeepSeek R1, 8K/1K):
AI 工厂投资回报 (AI Factory ROI):
结论:在 DeepSeek-R1 8K/1K 的测试结果中,NVIDIA Blackwell GB200 NVL72 相比 Hopper H200 展现了 15 倍的性能优势和巨大的收入机会。
注:收入估算基于 32 个 GPU 以每 GPU 每小时 2 美元的价格运行 3 年,使用 DeepSeek-R1 模型和 8->1/8M token 定价,集群利用率为 84k。数据来源为 InferenceMAX v1 2024年5月10日结果和 SemiAnalysis TCO 模型。仅供技术讨论和参考,实际性能可能因产品组合而异。
参考链接:https://developer.nvidia.com/blog/nvidia-blackwell-leads-on-new-semianalysis-inferencemax-benchmarks
以下图表展示了更多来自 SemiAnalysis InferenceMax™ 的基准测试结果,详细对比了不同 GPU(包括 Blackwell B200, GB200 和 Hopper H200)在不同配置下的性能。
左图 (DeepSeek R1 0528 - FP4+ - 8K / 1K):
右图 (DeepSeek R1 0528 - FP8 - 8K / 1K):
注:仅供技术讨论和参考,实际性能可能因产品组合而异。
数据来源:https://inferencemax.semianalysis.com/
Working with Quantized Types
https://docs.nvidia.com/deeplearning/tensorrt/latest/inference-library/work-quantized-types.html
NVFP4 Introduction
https://developer.nvidia.com/blog/introducing-nvfp4-for-efficient-and-accurate-low-precision-inference/
NVIDIA Blackwell Leads on SemiAnalysis InferenceMAX v1 Benchmarks
https://developer.nvidia.com/blog/nvidia-blackwell-leads-on-new-semianalysis-inferencemax-benchmarks
InferenceMax
https://inferencemax.semianalysis.com/